#ifndef mesinkata_h
#define mesinkata_h

#include<stdio.h>
#include<stdlib.h>
#include "../mesinkar/mesinkar.h"
#include "..\tanggal\tanggal.h"
#include "..\Boolean\Boolean.h"
#include "..\TahunAkademik\TahunAkademik.h"

#define BLANK ' '
#define NEWLINE '\n'
#define PETIK '"'
#define MaxStringLength 512

typedef struct {
	char s[MaxStringLength];
	int length;
} string;
//tipe data string

string cString;
//Current string, string yang saat ini sedang diakuisisi

bool end;
//Menandai apakah sudah end of pita

void Ignore_Blank(FILE *f);
/**
 * Melewatkan blank pada pita karakter
 * */

void StartString(FILE *f);
/**
 * Menginisiasi pembacaan pita karakter
 * */

void AdvString(FILE *f);
/**
 * Mengakuisisi 1 kata menjadi 1 string
 * */

void CopyString(FILE *f);
/**
 * Mengcopy 1 kata dari pita karakter ke string
 * */
 
void CopyString2(FILE *f);
/**
 * Mengcopy kata-kata yang diapit tanda petik, tanda petik tidak dimasukkan
 * I.S. : CC = '"'
 * F.S. : Kata yang diapit tanda petik dicopy ke string. "Hello hello" -> Hello Hello
 * */

bool IsStringEqual(string k1 , string k2);
/**
 * Mengecek kesamaan 2 string
 * */

bool IsStringStrictEqual(string k1 , string k2);
/**
 * Mengecek kesamaan 2 string
 * */
 
bool IsStringHasWhiteSpace(string s);
/***
Mengcek apakah s memiliki spasi
***/

string StrCat(string s1 , string s2);
/**
 * Menggabungkan 2 string
 * */

//RELASIONAL
bool IsStringStrictLt(string s1, string s2); // dengan memperhatikan Case

bool IsStringLt(string s1 , string s2);
/**
 * Mengecek apakah s1 lebih kecil daripada s2 secara alfabetikal
 * */

//KONVERTER
int StringToInt(string s);
string IntToString(long x);

char *StringToChar(string s);
string CharToString(char *c);

float StringToFloat(string s);
string FloatToString(float x);

bool StringToBool(string s);
string BoolToString(bool x);

date StringToDate(string s);
string DateToString(date d);

ThnAkademik StringToThnAkademik(string s);
string ThnAkademikToString(ThnAkademik T);

// PREDIKAT
bool IsStringInt(string s);
bool IsStringFloat(string s);
bool IsStringDate(string s);
bool IsStringThnAkademik(string s);
bool IsStringABCDE(string s);


//OPERATOR
string SubString(string s, int start, int length);
/**
 * Mengambil substring dari posisi start sepanjang length
 * */

void ToUpperCase(string *s);
/**
 * Mengubah s menjadi huruf besar semua
 * */

string UpperCase(string s);
/**
 * mengembalikan hasil konversi s menjadi huruf besar semua
 * */

string LowerCase(string s);
/**
 * mengembalikan hasil konversi s menjadi huruf kecil semua
 * */

string TrimWhiteSpace(string s);
/**
 * Menghilangkan spasi dari s
 * */

string DeleteSubString(string s , int pos , int length);
/**
 * menghilangkan substring dari string s dari posisi s sepanjang length
 * */

//--------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------
// Fungsi Tambahan
// Di-import dari _ADT_Hilmans_General

//------------------------------------------------------------------------------------------------------------------
// Fungsi berikut berhubungan dengan karakter-----------------------------------------------------------------------

int AddChrF(char InputS[], char InputC);
// menambahkan karakter InputC ke depan string InputS, ('X' + "hahaha") = "Xhahaha", maksud akhiran F pada fungsi adalah First

int AddChr(char InputS[], char InputC);
// menambahkan karakter InputC ke belakang string InputS, ("hahaha" + 'X') = "hahahaX"

int DelChrF(char InputS[]);
// menghapus satu karakter paling depan string, "abcdef" --> "bcdef", return 0 jika string sudah kosong

int DelChr(char InputS[]);
// menghapus satu karakter paling belakang string, "abcdef" --> "abcde", return 0 jika string sudah kosong

int ExistChar(char *InputS, char C);
// return Apakah ada karakter pertama C di string InputS, return (posisikarakter+1) jika ya, 0 klo nggak
// misalkan mencari'L' dari "FORMULA", returnnya adalah 6  <--(5+1)

int IsChar(char InputC);
// return apakah InputC antara 'A' dan 'Z'

char UpperChar(char C);

//--------------------------------------------------------------------------------------------------------------------
// Fungsi berikut berhubungan dengan string, atau char* --------------------------------------------------------------

int LongStr(char *InputS);
// return Panjang string InputS, "_HilPack_" akan return 9

int CopyStr(char Output[], char Input[]);
// menghapus isi Output dulu, lalu mengcopy string Input ke string Output
// bisa untuk mengosongkan string ---> CopyStr(Output,"");

int AddStrF(char S1[], char S2[]);  
// menambah string di depan
// mengubah string S1 dengan cara menambah S2 di depan S1, sehingga S1=S1+S2,  misalkan S1="abc",S2="xyz", maka S1 nanti "xyzabc"

int AddStr(char S1[], char S2[]);
// menambah string di belakang
// mengubah string S1 dengan cara menambah S2 di belakang S1 sehingga S1=S1+S2,  misalkan S1="abc",S2="xyz", maka S1 nanti "abcxyz"

int GetStr(char *OutputS ,char *InputS, int Start, int Stop);
// mengambil sejumlah string
// misalkan Start=2, Stop=5, maka OutputS=InputS[2]..InputS[5], contoh InputS="abcdefgh", maka OutputS="cdef"

int SameStr(char *S1, char *S2);
// mengecek apakah sedua string input sama, return 1 jika sama

int ExistSub(char *OutputS,char *InputS);
// mengecek apakah InputS merupakan SubString dari OutputS. Contoh OutputS="hilman's package", jika InputS="pack" maka return 1
// jika InputS="test" maka return 0

int ExistSubLast(char *OutputS,char *InputS);
// sama seperti ExistSub

int DelStrNumF(char *OutputS, int Num);
// menghapus sejumlah string di depan OutputS, misalkan Num=3, OutputS="testings", maka OutputS="tings" , hilang 3 karakter di depan

int DelStrNum(char *OutputS, int Num);
// menghapus sejumlah string di belakang OutputS, misalkan Num=3, OutputS="testings", maka OutputS="testi" , hilang 3 karakter di belakang

int GetStrLastCodeStr(char *OutputS, char *InputS, char *Pattern);
// mengambil string di belakang dengan penanda berhenti adalah Pattern

int UpperStr(char *OutputS, char *InputS);

int GetStrToUpper(char *OutputS ,char *InputS, int Start, int Stop);
// mengambil string, tetapi di UPCASE karakter outputnya

int ExistSubNoCase(char *OutputS,char *InputS);
// mengecek substring dengan mengabaikan Case

void AddSpace(char *STR, char *Paramstr);
// mengatur lebar untuk kolom
// Parameter  Lebar maksimum untuk string STR
// sites                      10
// servers                    8
// clients                    8
// retrieve                   10
// update                     9
// insert                     9
// delete                     9
// table                      14
// rec                        9
 
#endif
